package br.com.javajsf.controle;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.event.ActionEvent;
import javax.faces.model.SelectItem;

import br.com.javajsf.modelo.Cliente;
import br.com.javajsf.modelo.ContaCliente;
import br.com.javajsf.modelo.Pagamento;
import br.com.javajsf.modelo.Pedido;
import br.com.javajsf.modelo.Produto;
import br.com.javajsf.negocio.CadastradorCliente;
import br.com.javajsf.negocio.CadastradorPagamento;
import br.com.javajsf.negocio.CadastradorPedido;
import br.com.javajsf.negocio.CadastradorProduto;

@ManagedBean(name = "conContaBean")
public class CConsultaConta implements Serializable {

	private static final long serialVersionUID = 1L;
	
	private CadastradorCliente cliDao;

	private CadastradorPagamento pagDao;
	private CadastradorPedido pedDao;
	private CadastradorProduto prodDao;
	
	private Cliente cliente;
	private int clienteSelecionado;
	private List<SelectItem> listaItemCliente;
	private List<SelectItem> listaItemProduto;
	
	private List<Cliente> listCliente;
	private List<Produto> listProduto;
	
	private List<Pedido> listPedido;
	private List<Pagamento> listPagamentos;
	private List<ContaCliente> listaConta;
	private List<ContaCliente>listaCredito;
	
	private boolean showCred;
	private boolean showConta;
	
	private double precoTotal;
	private double totalCredito;
	private double precoTotalLista;
	
	
	@PostConstruct
	public void init(){
		setShowCred(false);
		listPedido = new ArrayList<Pedido>();
		listPagamentos = new ArrayList<Pagamento>();
		if (cliDao == null) {
			cliDao = new CadastradorCliente();
			prodDao = new CadastradorProduto();
			pagDao = new CadastradorPagamento();
			pedDao = new CadastradorPedido();
		}
		if(listaItemCliente == null){
			setListaItemCliente(getListaCliente());
			setListaItemProduto(getListaProduto());
		}
	}
	
	
	public List<SelectItem> getListaCliente(){
		ArrayList<SelectItem> listaIterable = new ArrayList<SelectItem>();
		listCliente = (List<Cliente>) cliDao.listarTodos();
		
		for (Cliente teste : listCliente) {
			SelectItem item = new SelectItem(teste.getCod(), teste.getNome());
			listaIterable.add(item);
		}
		return listaIterable;
	}
	
	public List<SelectItem> getListaProduto(){
		ArrayList<SelectItem> listaIterable = new ArrayList<SelectItem>();
		listProduto = (List<Produto>) prodDao.listarTodos();
		
		for (Produto prod : listProduto) {
			listaIterable.add(new SelectItem(prod.getCod(), prod.getNome()));
		}
		return listaIterable;
	}
	
	
	public void consultarContaCliente(ActionEvent action){
		listPedido.clear();
		listPagamentos.clear();
		double valorTotalPedidos = 0;
		double valorTotalPagamento = 0;
		precoTotalLista = 0;
		
		setCliente(new Cliente());
		
		if (clienteSelecionado > 0) {
			setCliente((Cliente) cliDao.buscarCod(clienteSelecionado));	
			listPagamentos = pagDao.listarPagtsCliente(clienteSelecionado);
			listPedido = (List<Pedido>)pedDao.listarPedidosCliente(clienteSelecionado);
			
			for (Pedido listaPed : listPedido) {
				valorTotalPedidos += listaPed.getQtde() * listaPed.getProduto().getValor();
			}
		
			for (Pagamento pag : listPagamentos) {
				valorTotalPagamento += pag.getValor(); 
			}
				
			precoTotalLista = valorTotalPedidos - valorTotalPagamento;
			
			if(precoTotalLista < 0){
				totalCredito = -precoTotalLista;
				precoTotalLista = 0;
				setShowCred(true);
			}
		}
	}
	
	
	public void consultarConta(ActionEvent action){
		if(listaConta != null){
			listaConta.clear();
			System.out.println("Limpou a lista");
		}
		listaCredito = new ArrayList<ContaCliente>();
		listaConta = (List<ContaCliente>) cliDao.listarConta();			
		
		if (listaConta.size() > 0) {
			setShowConta(true);
		}
		
		for (ContaCliente cliConta : listaConta) {
			System.out.println(cliConta.getCliente().getNome()+" / "+cliConta.getValorTotal());
			if(cliConta.getValorTotal() < 0){
				listaCredito.add(cliConta);
			}
		}
		if(listaCredito.size() > 0){
			for (ContaCliente cliCred : listaCredito) {
				cliCred.setValorTotal(-cliCred.getValorTotal());
				listaConta.remove(cliCred);
				System.out.println("Cliente: "+cliCred.getCliente().getNome()+"Valor Credito: "+cliCred.getValorTotal());
			}
		}
	}
		
		public void zeraLista(){
			if (!listPedido.isEmpty()) {
				listPedido.clear();
				precoTotal = 0;
			}if(listPagamentos != null){
				if (!listPagamentos.isEmpty()) {
					listPagamentos.clear();
					precoTotalLista = 0;
				}
			}
			setShowCred(false);
		}
		
		
		
		public List<SelectItem> getListaItemCliente() {
			return listaItemCliente;
		}

		public void setListaItemCliente(List<SelectItem> listaItemCliente) {
			this.listaItemCliente = listaItemCliente;
		}

		public List<SelectItem> getListaItemProduto() {
			return listaItemProduto;
		}

		public void setListaItemProduto(List<SelectItem> listaItemProduto) {
			this.listaItemProduto = listaItemProduto;
		}


		public int getClienteSelecionado() {
			return clienteSelecionado;
		}


		public void setClienteSelecionado(int clienteSelecionado) {
			this.clienteSelecionado = clienteSelecionado;
		}


		public Cliente getCliente() {
			return cliente;
		}


		public void setCliente(Cliente cliente) {
			this.cliente = cliente;
		}


		public double getPrecoTotalLista() {
			return precoTotalLista;
		}


		public void setPrecoTotalLista(double precoTotalLista) {
			this.precoTotalLista = precoTotalLista;
		}


		public boolean isShowCred() {
			return showCred;
		}


		public void setShowCred(boolean showCred) {
			this.showCred = showCred;
		}


		public double getTotalCredito() {
			return totalCredito;
		}


		public void setTotalCredito(double totalCredito) {
			this.totalCredito = totalCredito;
		}


		public boolean isShowConta() {
			return showConta;
		}


		public void setShowConta(boolean showConta) {
			this.showConta = showConta;
		}


		public List<ContaCliente> getListaConta() {
			return listaConta;
		}


		public void setListaConta(List<ContaCliente> listaConta) {
			this.listaConta = listaConta;
		}


		public List<ContaCliente> getListaCredito() {
			return listaCredito;
		}


		public void setListaCredito(List<ContaCliente> listaCredito) {
			this.listaCredito = listaCredito;
		}
		
}
